#include "slope1c1.h"
/*CME-595*/
void DIF_vSlopeCalculation(void)
{
    DIF_tstSlopeDpoolData stDIFSlopeDpool;

    // 从数据池获取当前坡度数据
    DPOOL_enGetPoolData(DPOOL_nDataDIF_stSlopeDpoolData, &stDIFSlopeDpool);

    // 声明静态变量保存最后一次有效值
    static uint8 s_u8LastValidAngle = 0;
    static uint8 s_u8LastValidDirection = 0; // 0:水平, 1:上坡, 2:下坡

    // 读取CAN信号
    uint8 u8PitchAngSign = PitchAngSign_read();
    uint8 u8PitchAng = PitchAng_read();

    // 设置单位固定为度(1)
    stDIFSlopeDpool.DIF_u8SlopeUnit = 1;

    // 检查信号超时
    if (Flg_PitchAngSign_tmout() || Flg_PitchAng_tmout())
    {
        // 信号超时，使用最后一次有效值
        stDIFSlopeDpool.DIF_u8SlopeAngleValue = s_u8LastValidAngle;
        stDIFSlopeDpool.DIF_u8SlopeDirectionValue = s_u8LastValidDirection;
    }
    else
    {
        // 信号有效，处理坡度数据
        if (u8PitchAng == 0x00)
        {
            // 水平位置，0°
            stDIFSlopeDpool.DIF_u8SlopeAngleValue = 0;
            stDIFSlopeDpool.DIF_u8SlopeDirectionValue = 0; // 水平图标

            // 更新最后一次有效值
            s_u8LastValidAngle = 0;
            s_u8LastValidDirection = 0;
        }
        else if (u8PitchAng >= 0x01 && u8PitchAng <= 0x5A)
        {
            // 有效角度值范围(1°~90°)
            stDIFSlopeDpool.DIF_u8SlopeAngleValue = u8PitchAng; // 直接使用原始值(1-90)

            // 根据符号确定图标方向
            if (u8PitchAngSign == 0x0)
            {
                stDIFSlopeDpool.DIF_u8SlopeDirectionValue = 1; // 上坡图标
            }
            else
            {
                stDIFSlopeDpool.DIF_u8SlopeDirectionValue = 2; // 下坡图标
            }

            // 更新最后一次有效值
            s_u8LastValidAngle = u8PitchAng;
            s_u8LastValidDirection = stDIFSlopeDpool.DIF_u8SlopeDirectionValue;
        }
        else if (u8PitchAng >= 0x5B && u8PitchAng <= 0x7F)
        {
            // 保留值范围，使用最后一次有效值
            stDIFSlopeDpool.DIF_u8SlopeAngleValue = s_u8LastValidAngle;
            stDIFSlopeDpool.DIF_u8SlopeDirectionValue = s_u8LastValidDirection;
        }
        else
        {
            // 无效值，使用最后一次有效值
            stDIFSlopeDpool.DIF_u8SlopeAngleValue = s_u8LastValidAngle;
            stDIFSlopeDpool.DIF_u8SlopeDirectionValue = s_u8LastValidDirection;
        }
    }

    // 设置数据池供HMI使用显示
    DPOOL_enSetPoolData(DPOOL_nDataDIF_stSlopeDpoolData, &stDIFSlopeDpool);

}